/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * CadastroEstoque.java
 *
 * Created on Aug 31, 2009, 10:35:35 PM
 */
package br.di0.nyx.cadastro;

import br.di0.sql.consulta.ConsultaProdutoDialog;
import br.di0.sql.insert.InsertEstoque;
import br.di0.uteis.MyOwnFocusTraversalPolicy;
import java.awt.Component;
import java.util.Vector;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import strategy.IDocument;
import strategy.concretas.DocNumeros;

/**
 *
 * @author di0
 */
public class CadastroEstoque extends javax.swing.JInternalFrame
        implements CadastroFrame {

    /** Creates new form CadastroEstoque */
    public CadastroEstoque() {
        initComponents();
        focusCicle();
        limitarCampos();
        limparTela();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        tipoMovimentobuttonGroup = new javax.swing.ButtonGroup();
        comandosPanel = new javax.swing.JPanel();
        salvarButton = new javax.swing.JButton();
        cancelarButton = new javax.swing.JButton();
        estoquePanel = new javax.swing.JPanel();
        codProdutoLabel = new javax.swing.JLabel();
        codProdutoTextField = new javax.swing.JTextField();
        descricaoLabel = new javax.swing.JLabel();
        descricaoTextField = new javax.swing.JTextField();
        saldoLabel = new javax.swing.JLabel();
        movimentoPanel = new javax.swing.JPanel();
        entradaRadioButton = new javax.swing.JRadioButton();
        saidaRadioButton = new javax.swing.JRadioButton();
        quantidadeLabel = new javax.swing.JLabel();
        qtdTextField = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        saldoFinalTextField = new javax.swing.JTextField();
        saldoTextField = new javax.swing.JTextField();
        buscaProdutoButton = new javax.swing.JButton();

        setClosable(true);
        setIconifiable(true);
        setTitle("Estoque");

        comandosPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
        comandosPanel.setLayout(new java.awt.GridLayout(1, 0));

        salvarButton.setMnemonic('S');
        salvarButton.setText("Salvar");
        salvarButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                salvarButtonActionPerformed(evt);
            }
        });
        comandosPanel.add(salvarButton);

        cancelarButton.setMnemonic('C');
        cancelarButton.setText("Cancelar");
        cancelarButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cancelarButtonActionPerformed(evt);
            }
        });
        comandosPanel.add(cancelarButton);

        estoquePanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));

        codProdutoLabel.setText("Código Produto");

        codProdutoTextField.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                codProdutoTextFieldFocusGained(evt);
            }
            public void focusLost(java.awt.event.FocusEvent evt) {
                codProdutoTextFieldFocusLost(evt);
            }
        });

        descricaoLabel.setText("Descrição");

        descricaoTextField.setEditable(false);
        descricaoTextField.setFont(new java.awt.Font("DejaVu Sans", 1, 13)); // NOI18N
        descricaoTextField.setFocusable(false);

        saldoLabel.setText("Saldo");

        movimentoPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Movimentação"));

        entradaRadioButton.setSelected(true);
        entradaRadioButton.setText("Entrada");
        entradaRadioButton.setEnabled(false);
        tipoMovimentobuttonGroup.add(entradaRadioButton);
        entradaRadioButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                entradaRadioButtonActionPerformed(evt);
            }
        });

        saidaRadioButton.setText("Saída");
        tipoMovimentobuttonGroup.add(saidaRadioButton);
        saidaRadioButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                saidaRadioButtonActionPerformed(evt);
            }
        });

        quantidadeLabel.setText("Quantidade");

        qtdTextField.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                qtdTextFieldKeyReleased(evt);
            }
        });

        jLabel1.setText("Saldo Final");

        saldoFinalTextField.setEditable(false);
        saldoFinalTextField.setFont(new java.awt.Font("DejaVu Sans", 1, 13));
        saldoFinalTextField.setText("0");
        saldoFinalTextField.setFocusable(false);

        javax.swing.GroupLayout movimentoPanelLayout = new javax.swing.GroupLayout(movimentoPanel);
        movimentoPanel.setLayout(movimentoPanelLayout);
        movimentoPanelLayout.setHorizontalGroup(
            movimentoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(movimentoPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(movimentoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(entradaRadioButton)
                    .addComponent(saidaRadioButton))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(movimentoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(quantidadeLabel)
                    .addComponent(jLabel1))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(movimentoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(qtdTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(saldoFinalTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        movimentoPanelLayout.setVerticalGroup(
            movimentoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(movimentoPanelLayout.createSequentialGroup()
                .addGroup(movimentoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(entradaRadioButton)
                    .addComponent(quantidadeLabel)
                    .addComponent(qtdTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(movimentoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(saldoFinalTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel1)
                    .addComponent(saidaRadioButton))
                .addContainerGap())
        );

        saldoTextField.setEditable(false);
        saldoTextField.setText("0");
        saldoTextField.setFocusable(false);

        buscaProdutoButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/di0/icones/lupa16x16.png"))); // NOI18N
        buscaProdutoButton.setFocusable(false);
        buscaProdutoButton.setName("buscaProdutoButton"); // NOI18N
        buscaProdutoButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buscaProdutoButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout estoquePanelLayout = new javax.swing.GroupLayout(estoquePanel);
        estoquePanel.setLayout(estoquePanelLayout);
        estoquePanelLayout.setHorizontalGroup(
            estoquePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(estoquePanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(estoquePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(movimentoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(estoquePanelLayout.createSequentialGroup()
                        .addGroup(estoquePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(codProdutoLabel)
                            .addComponent(saldoLabel)
                            .addComponent(descricaoLabel))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(estoquePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(descricaoTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGroup(estoquePanelLayout.createSequentialGroup()
                                .addComponent(codProdutoTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(buscaProdutoButton))
                            .addComponent(saldoTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE))))
                .addContainerGap())
        );
        estoquePanelLayout.setVerticalGroup(
            estoquePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(estoquePanelLayout.createSequentialGroup()
                .addGroup(estoquePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(estoquePanelLayout.createSequentialGroup()
                        .addGap(15, 15, 15)
                        .addGroup(estoquePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(codProdutoLabel)
                            .addComponent(codProdutoTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(estoquePanelLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(buscaProdutoButton, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(estoquePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(descricaoTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(descricaoLabel))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(estoquePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(saldoLabel)
                    .addComponent(saldoTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(movimentoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(comandosPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 291, Short.MAX_VALUE)
            .addComponent(estoquePanel, javax.swing.GroupLayout.DEFAULT_SIZE, 291, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addComponent(estoquePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 9, Short.MAX_VALUE)
                .addComponent(comandosPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void salvarButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_salvarButtonActionPerformed
        if (qtdTextField.getText().equals("")) {
            JOptionPane.showMessageDialog(null, "Nenhuma quantidade digitada",
                    "Estoque", JOptionPane.WARNING_MESSAGE);
            qtdTextField.requestFocus();
        } else {
            int qtd = Integer.parseInt(qtdTextField.getText());
            int saldo = Integer.parseInt(saldoTextField.getText());
            int saldoFinal;
            int result;
            if (entradaRadioButton.isSelected()) {
                saldoFinal = saldo + qtd;
                String[] produto = new String[2];
                produto[0] = codProdutoTextField.getText();
                produto[1] = Integer.toString(saldoFinal);
                result = InsertEstoque.atualizar(produto);
            } else {
                saldoFinal = saldo - qtd;
                if (saldoFinal < 0) {
                    JOptionPane.showMessageDialog(null, "Saldo final deve ser maior que zero",
                            "Estoque", JOptionPane.WARNING_MESSAGE);
                    qtdTextField.requestFocus();
                    result = -1;
                } else {
                    String[] produto = new String[2];
                    produto[0] = codProdutoTextField.getText();
                    produto[1] = Integer.toString(saldoFinal);
                    result = InsertEstoque.atualizar(produto);
                }
            }
            if (result == 1) {
                JOptionPane.showMessageDialog(null, "Saldo do produto [" +
                        descricaoTextField.getText() + "] alterado com sucesso",
                        "Estoque", JOptionPane.INFORMATION_MESSAGE);
                limparTela();
            }
        }
}//GEN-LAST:event_salvarButtonActionPerformed

    private void cancelarButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelarButtonActionPerformed
        limparTela();
}//GEN-LAST:event_cancelarButtonActionPerformed

    private void buscaProdutoButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buscaProdutoButtonActionPerformed
        String type = new String("1");
        ConsultaProdutoDialog person = new ConsultaProdutoDialog(null, true, codProdutoTextField, type);
        person.setVisible(true);
}//GEN-LAST:event_buscaProdutoButtonActionPerformed

    private void codProdutoTextFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_codProdutoTextFieldFocusLost
        //TODO carregar saldo de produto
        Component comp = evt.getOppositeComponent();
        if (comp != null) {
            if (comp.getName() == null) {
                carregarProduto();
                focusCicle();
                atualizaSaldo();
            } else {
                System.out.println(comp.getName());
            }
        }
}//GEN-LAST:event_codProdutoTextFieldFocusLost

    private void saidaRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saidaRadioButtonActionPerformed
        // TODO add your handling code here:
        saidaRadioButton.setEnabled(false);
        entradaRadioButton.setEnabled(true);
        focusCicle();
        atualizaSaldo();
    }//GEN-LAST:event_saidaRadioButtonActionPerformed

    private void entradaRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_entradaRadioButtonActionPerformed
        // TODO add your handling code here:
        entradaRadioButton.setEnabled(false);
        saidaRadioButton.setEnabled(true);
        focusCicle();
        atualizaSaldo();
    }//GEN-LAST:event_entradaRadioButtonActionPerformed

    private void qtdTextFieldKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_qtdTextFieldKeyReleased
        atualizaSaldo();
    }//GEN-LAST:event_qtdTextFieldKeyReleased

    private void codProdutoTextFieldFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_codProdutoTextFieldFocusGained
        carregarProduto();
        focusCicle();
        atualizaSaldo();
    }//GEN-LAST:event_codProdutoTextFieldFocusGained

    private void atualizaSaldo() {
        int saldo;
        int qtd;
        int saldoFinal;
        if (qtdTextField.getText().equals("")) {
            qtd = 0;
        } else {
            qtd = Integer.parseInt(qtdTextField.getText());
        }

        if (saldoTextField.getText().equals("")) {
            saldo = 0;
        } else {
            saldo = Integer.parseInt(saldoTextField.getText());
        }

        if (entradaRadioButton.isSelected()) {
            saldoFinal = saldo + qtd;
        } else {
            saldoFinal = saldo - qtd;
        }

        saldoFinalTextField.setText(Integer.toString(saldoFinal));
        if (saldoFinalTextField.getText().equals("")) {
            saldoFinalTextField.setText("0");
        }
    }

    private void carregarProduto() {
        //TODO implementar consulta direto na tabela estoque
        String codProduto = codProdutoTextField.getText();

        if (!codProduto.equals("")) {
            if (lastCod == null) {
                lastCod = codProduto;
                String produto[] = InsertEstoque.localizar(codProduto);
                if (produto != null) {
                    descricaoTextField.setText(produto[0]);
                    saldoTextField.setText(produto[1]);

                } else {
                    JOptionPane.showMessageDialog(null, "Código não encontrado",
                            "Cadastro de Produtos", JOptionPane.WARNING_MESSAGE);
                    codProdutoTextField.setText("");
                    codProdutoTextField.requestFocus();
                }
            } else if (lastCod.equals(codProduto)) {
                //não faz nada
            } else {
                lastCod = codProduto;
                String produto[] = InsertEstoque.localizar(codProduto);
                if (produto != null) {
                    descricaoTextField.setText(produto[0]);
                    saldoTextField.setText(produto[1]);

                } else {
                    JOptionPane.showMessageDialog(null, "Código não encontrado",
                            "Cadastro de Produtos", JOptionPane.WARNING_MESSAGE);
                    codProdutoTextField.setText("");
                    codProdutoTextField.requestFocus();
                }
            }
        }
    }
    private Vector<Component> order = new Vector<Component>(10);
    private MyOwnFocusTraversalPolicy newPolicy;
    private IDocument doc;
    private String lastCod = null;
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton buscaProdutoButton;
    private javax.swing.JButton cancelarButton;
    private javax.swing.JLabel codProdutoLabel;
    private javax.swing.JTextField codProdutoTextField;
    private javax.swing.JPanel comandosPanel;
    private javax.swing.JLabel descricaoLabel;
    private javax.swing.JTextField descricaoTextField;
    private javax.swing.JRadioButton entradaRadioButton;
    private javax.swing.JPanel estoquePanel;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel movimentoPanel;
    private javax.swing.JTextField qtdTextField;
    private javax.swing.JLabel quantidadeLabel;
    private javax.swing.JRadioButton saidaRadioButton;
    private javax.swing.JTextField saldoFinalTextField;
    private javax.swing.JLabel saldoLabel;
    private javax.swing.JTextField saldoTextField;
    private javax.swing.JButton salvarButton;
    private javax.swing.ButtonGroup tipoMovimentobuttonGroup;
    // End of variables declaration//GEN-END:variables

    public void limparTela() {
        codProdutoTextField.setText("");
        descricaoTextField.setText("");
        saldoTextField.setText("0");
        qtdTextField.setText("");
        saldoFinalTextField.setText("0");
        entradaRadioButton.setSelected(true);
        entradaRadioButton.setEnabled(false);
        saidaRadioButton.setEnabled(true);
        codProdutoTextField.requestFocus();
        focusCicle();
    }

    public void focusCicle() {
        order = new Vector<Component>(10);

        order.add(codProdutoTextField);
        //order.add(buscaProdutoButton);

        if (entradaRadioButton.isSelected()) {
            order.add(saidaRadioButton);
        } else {
            order.add(entradaRadioButton);
        }

        order.add(qtdTextField);

        order.add(salvarButton);
        order.add(cancelarButton);

        newPolicy = new MyOwnFocusTraversalPolicy(order);
        this.setFocusTraversalPolicy(newPolicy);
    }

    public void limitarCampos() {
        //códigoProduto
        doc = new DocNumeros(5);
        codProdutoTextField.setDocument(doc.getDocumentoPlano());

        doc = new DocNumeros();
        saldoTextField.setDocument(doc.getDocumentoPlano());

        doc = new DocNumeros();
        qtdTextField.setDocument(doc.getDocumentoPlano());

        doc = new DocNumeros();
        saldoFinalTextField.setDocument(doc.getDocumentoPlano());
    }

    public void setCodText(String cod) {
        throw new UnsupportedOperationException("Método não aplicável neste contexto");
    }

    public void ativaCodigo(JTextField codigoField, boolean desativar) {
        throw new UnsupportedOperationException("Método não aplicável neste contexto");
    }
}
